module ecs{
    /**
     * 数组的非常基本的包装器，当它达到容量时自动扩展它。
     */
    export class FastList<T>{
        public Buffer: T[];
        public Length: number = 0;

        constructor(size: number = 5){
            this.Buffer = new Array<T>(size);
        }

        /**
         * 将项目添加到列表
         * @param item 
         */
        public Add(item: T){
            this.Buffer[this.Length ++] = item;
        }

        /**
         * 从列表中删除该项目
         * @param item 
         */
        public Remove(item: T){
            for (let i = 0; i < this.Length; i++) {
                if (this.Buffer[i] == item){
                    this.RemoveAt(i);
                    return;
                }          
            }
        }

        /**
         * 从列表中删除给定索引处的项目
         * @param index 
         */
        public RemoveAt(index: number){
            if (index < this.Length)
                throw new Error("Index out of range!");

            this.Length --;
            this.Buffer.splice(index, 1);
        }

        /**
         * 按长度排序缓冲区中的所有项目
         */
        public Sort(){
            this.Buffer.sort();
        }

        /** 检查项目是否在FastList中 */
        public Contains(item: T): boolean{
            for (var i = 0; i < this.Length; ++i){
                if (this.Buffer[i] === item){
                    return true;
                }
            }

            return false;
        }
    }
}